package com.csap.framework.oauth2.server.service;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.oauth2.logic.SaOAuth2Util;
import cn.dev33.satoken.oauth2.model.AccessTokenModel;
import cn.dev33.satoken.oauth2.model.RequestAuthModel;
import cn.dev33.satoken.secure.SaSecureUtil;
import com.csap.framework.extension.result.ResultParam;
import com.csap.framework.oauth2.UserInfo;
import com.csap.framework.oauth2.request.RegisterRequest;
import com.csap.framework.oauth2.request.UpdateRequest;
import com.csap.framework.oauth2.response.RegisterResponse;

/**
 * @author yangchengfu
 * @dataTime 2021年-07月-30日 14:02:00
 **/
public interface Oauth2ServerService {
    String REGISTER_LOCK_KEY = ":registerLock:%s";

    /**
     * 获取用户信息
     *
     * @param loginId 登录的ID
     * @return 结果
     */
    UserInfo userInfo(Object loginId);

    /**
     * 获取登录的token
     *
     * @param id       登录的ID
     * @param clientId 客户端的ID
     * @param scope    作用域
     * @return token信息
     */
    default AccessTokenModel accessToken(Object id, String clientId, String scope, String userToken) {
        return SaOAuth2Util.generateAccessToken(RequestAuthModel.builder()
                        .clientId(clientId)
                        .loginId(id)
                        .scope(scope)
                        .build(), true)
                .setUserToken(userToken);
    }

    /**
     * 登录
     *
     * @param loginType 登录类型
     * @param platform  平台标识
     * @param userName  账号
     * @param password  密码
     * @return 结果
     */
    default ResultParam<AccessTokenModel> login(String loginType, String platform, String userName, String password) {
        return login(userName, platform, SaSecureUtil.sha256(password), null, SaHolder.getRequest().getParam("clientId"));
    }

    /**
     * 登录
     *
     * @param userName   账号
     * @param platform   平台标识
     * @param password   密码
     * @param deviceType 设备类型
     * @param clientId   应用ID
     * @return 结果
     */
    ResultParam<AccessTokenModel> login(String userName, String platform, String password, String deviceType, String clientId);

    /**
     * 一键登录
     *
     * @param registerRequest 请求对象
     */
    void loginRegister(RegisterRequest registerRequest);

    /**
     * 手机号码登录
     *
     * @param mobile   手机号码
     * @param clientId 应用ID
     * @param scope    作用域
     * @return 结果
     */
    AccessTokenModel loginMobile(String mobile, String platform, String clientId, String deviceType, String scope);

    /**
     * 是否需要注册--一键登录使用
     *
     * @param registerRequest 注册信息
     * @param notNullThrow    不等于null是否抛出异常
     * @return 结果
     */
    Boolean isRegister(RegisterRequest registerRequest, Boolean notNullThrow);

    /**
     * 注册账号
     *
     * @param registerRequest 注册数据
     * @return 结果
     */
    RegisterResponse register(RegisterRequest registerRequest);

    /**
     * 根据opendId修改
     *
     * @param updateRequest 修改信息
     * @return 结果
     */
    Boolean updateByOpenId(UpdateRequest updateRequest);

    /**
     * 根据openId删除用户
     *
     * @param openId   用户的openId
     * @param clientId 客户端ID
     * @return 是否删除成功
     */
    Boolean removeByOpenId(String openId, String clientId);

    /**
     * 根据userId修改
     *
     * @param updateRequest 修改信息
     * @return 结果
     */
    Boolean updateByUserId(UpdateRequest updateRequest);
}
